from dataclasses import dataclass
from datetime import datetime, timedelta
import pytz

timezone = pytz.timezone("Europe/Moscow")

def is_actual_date(event_date: datetime) -> bool:
    """Проверяет, прошла ли уже дата"""
    now = datetime.now(timezone)
    return event_date.timestamp() > now.timestamp()

def get_now_datetime_str() -> str:
    """Возвращает сегодняшний datetime с учётом времненной зоны."""
    now = datetime.now(timezone)
    return datetime2date_string(now)

def parse_datetime_string(datetime_string: str) -> datetime | None:
    """
    Парсит строку с датой и временем и возвращает объект datetime
    """
    datetime_string = datetime_string.replace("/", "-").replace("\\", "").replace(".", "-")
    try:
        return datetime.strptime(f"{datetime_string}", '%d-%m-%y %H:%M')
    except ValueError:
        return None

@dataclass
class NotificationDates:
    befor_day: datetime
    befor_4hours: datetime
    befor_5mins: datetime
    

def compute_notification_dates(event_date: datetime) -> NotificationDates:
    """
    По дате события рассчитывает даты напоминаний и возвращает их
    """
    befor_day = event_date - timedelta(days=1)
    befor_4hours = event_date - timedelta(hours=4)
    befor_5mins = event_date - timedelta(minutes=5)

    return NotificationDates(befor_day, befor_4hours, befor_5mins) 

def datetime2date_string(date_time: datetime) -> str:
    """
    Преобразует объект datetime в строку нужного формата без секунд
    """
    return date_time.strftime("%Y-%m-%d %H:%M")


